
#字符串.find("要查找字符")
#查询结果为查找字符下标
info = "abcdefg"
print(info[2])
print(info.find("e"))


#str.replace(old, new, count)
#替换字符串中的指定子串
#str: 要操作的原始字符串,old: 需要被替换的旧子串（必须是字符串类型）,
#new: 用来替换的新子串（也必须是字符串类型）,count (可选): 指定要替换的最大次数
info1 = "本套视频从零开始讲解，包含了软件测试入门、接口测试、自动化测试、测试开发等。"
info1.replace("本套","上套上套")
# 原字符串不会变化，不能修改只能重新赋值
print(info1)
info2 = info1.replace("本套","上套上套")
print(info2)

#separator.join(iterable)
#separator: 字符串
#iterable: 字符串组成的列表或元组
info3 = ["张三", "李四", "王五"]
info4 = "和".join(info3)
print(info4)

#str.split(separator, maxsplit)
#str: 要操作的字符串、separator:指定按什么字符进行分割、maxsplit: 指定分割的最大次数
#字符串分割
info5 = ("软件测试入门、接口测试、自动化测试、测试开发")
print(info5.split("、",))
for i in info5.split("、",):
    print(i)

#转大写: 字符串.upper()
#转小写: 字符串.lower()
#判断是字母: 字符串.isalpha()
#判断是数字: 字符串.isdigit()
#某个字符出现次数: 字符串.count("字符")
#字符串的长度: len(字符串)
#字符串两头去除空格: 字符串.strip()

info6 = "aBCDefg"
info7 = info6.upper()
print(info7)
if(info6.isalpha()):
    print("是字符")
else:
    print("不是字符")
print(info6.count("B"))
print(len(info6))

#列表
#用[]定义: 列表变量名 = []
#类实例化方式定义: 列表变量名 = list()
#字符在列表的位置: 列表.index("")
info8 = []
info9 = list()
info10 = ["张三","李四","王五"]
#print('王五的下标为' + info10.index("王五"))#错误写法python字符串和整数不能直接相加
print('王五的下标为' + str(info10.index("王五")))

#列表某元素出现的次数: 列表.count("元素")
info11 = ['python', 'java', 'python', 'php']
print(info11.count("python"))

#列表末尾增加元素: 列表名.append(元素)
info11.append("python")
print(info11)
print(info11.count("python"))

#列表指定位置增加元素: 列表名.insert(下标,元素)
info11.insert(1,"c++")
print(info11)

#列表的合并: 列表1.extend(列表2)
#列表2加到列表1上，列表1变列表2不变
info12 = ["张三","李四"]
info13 = ["吃饭","喝水"]
info12.extend(info13)
print(info12)
print(info13)

#列表指定索引位置删除: 列表名.pop(索引)
#删除不传入索引时，默认删除列表最后一个数据（元素）
#删除传入的索引不存在（超出范围）时，代码报错
print(info11)
info11.pop(0)
print(info11)

#列表指定数据删除: 列表名.remove(元素)
#列表中存在多个该元素使，删除第一个匹配到的
#如果删除的元素在列表不存在，代码会报错
print(info11)
info11.remove("php")
print(info11)

#列表修改指定索引的数据: 列表名[索引]=新数据
#指定索引存在，则该位置的元素被修改，如果不存在，则代码报错
info11[2] = "php"
print(info11)

#列表元素倒置（反转）: 列表名.reverse()
info11.reverse()
print(info11)

#列表大小排列: 列表名.sort(key=None, reverse=False)
#key为排序规则，key默认Nome值可以是: len(字符长度) 、abs(绝对值) 、str.lower(按字母)
#对列表元素默认从小到大排序，即reverse=False
#对列表元素从大到小排序，需要修改reverse=True
info14 = [1,5,4,6,8,2,3,7,9]
info14.sort()
print(info14)
info14.sort(reverse=True)
print(info14)
info11.sort(key=len,reverse=False)
print(info11)

#列表的嵌套元素获取：列表中的元素还是列表
info15 = [["张三", "18", "功能测试"], ["李四", "20", "自动化测试"], ["王五", "22",
["python", "java"]]]
print(info15[1][0])
for i in info15:
    print(i[0])

#元组
#空元组:
#用()定义： 元组变量名 = ()
#类实例化方式定义： 元组变量名 = tuple()
#非空元组：
#元组变量名 = (元素1,元素2,...)
#元组变量名 = 元素1,元素2,...
#单个元素定义
#info16 = ("55") #错误不加逗号此时为：<class 'str'>
info16 = ("55",)

info17 = "张三", "李四", "王五", "赵六"
print(type(info17))

#元组使用: 元组名[索引]
print(info17[2])
#元组元元素统计: 元组名.count(元素)
print(info17.count("赵六"))
#元组其他应用：数据交换
info18 = 100
info19 = 200
info18,info19 = info19,info18
print(info18)
print(info19)

info20 = {}
info21 = dict()
print(type(info20), type(info21))
print(info20)
# 非空字典
info21 = {"name": "张三", "age": 22, "height": 1.88}
print(info21)
print(type(info21))

#字典新增或修改值: 字典["键"] = "值"
#注意事项: 字典中键存在则修改值，键不存在则新增值
info21["sex"]="男"
print(info21)

#字典值的使用
print(info21["name"])

#字典删除值：字典名.pop(键)
info21.pop("sex")
#print(info21.pop("sex"))#输出删除的数据
print(info21)

#字典中取值
#格式1: 变量 = 字典名[键]
#格式2: 变量 = 字典名.get(键)
#注意事项：
#格式1键存在返回对应值，键不存在，则代码报错
#格式2键存在返回对应值，键不存在，则返回None
info22 = info21["name"]
info23 = info21.get("age")
print(info22)
print(info23)

info24 = {
"name": "tom",
"age": 18,
"gender": "男",
"hobby": {"read": "小说", "sport": ["篮球", "足球"]}
}
print(info24["hobby"])
print(info24["hobby"]["read"])
print(info24["hobby"]["sport"])
print(info24["hobby"]["sport"][1])
print(info24.get("hobby").get("sport")[0])

#字典合并/新增: 字典1.update(字典2)
#字典1变字典2不变
#注意事项：字典1中如果存字典2的键则被更新，否则被新增
info25 = {"name": "张三", "age": 18}
# 定义字典2
info26 = {"height": 1.88}
# 将字典2合并到字典1
info25.update(info26)
print(info25)
print(info26)

# 遍历获取字典中所有键
for i in info25.keys():
    print(f"字典的键是：{i}")
# 遍历获取字典中所有值
for i in info25.values():
    print(f"字典的值是：{i}")
# 遍历获取字典的键和值
for k, v in info25.items():
    print(f"{k} = {v}")

#集合
#集合的定义:
#空集合：
#类实例化方式定义： 变量名 = set()
#非空集合：
#集合变量名 = {值1,值2,...}
#集合元素添加: 集合.add(元素)
#列表元素去重: 变量 = set(列表名)
#定义空集合
info27 = set()
print(info27)
#集合中添加元素
info27.add("a")
info27.add("b")
print(info27)
#定义非空字符串
info28 = "abcdeabdcdf"
#去重
print(set(info28))
#转换为列表
tmp = list(set(info28))
#再进行排序
tmp.sort()
print(tmp)
#还原成字符串
print("".join(tmp))

# 切片
# 切片: 变量名[start:end:step]
# start: 切片开始下标
# end: 切片结束下标
# step: 切片步长(可选)
info29 = "abcdefgh"
# 获取cde
print(info29[2:5])
print(info29[2:5:1])
print(info29[-6:-3])
print(info29[-6:-3:1])
# 获取defgh的字符
print(info29[3:8])
print(info29[3:]) # 结束下标不写，默认从开始下标到结尾
print(info29[-5:])
# 获取abc的字符
# 获取ace的字符
print(info29[0:5:2]) # 取出0 、2 、4下标对应元素
print(info29[:5:2]) # 开始下标不写，默认从第一个元素开始
# 获取hgfedcba
print(info29[::-1])

info30 = [11, "aa", 1.88, (1, 2, 3), ["aa", "bb"]]
print(info30)
print(info30[3][1])

# 长度
# 字符串长度
info31 = "abcdefghij"
print(len(info31))
# 列表长度: len(变量名)
info32 = [11, "aa", 1.88, (1, 2, 3), ["aa", "bb"]]
print(len(info32))
# 元组长度: len(变量名)
info33 = ('a','b','c','d','e','f','g')
print(len(info33))
# 字典长度: len(变量名)
info34 = {"name":"张三","age":"18","height":"185"}
print(len(info34))

# 清空
# 清空列表:
info32.clear()
print(len(info32))
# 清空字典:
info34.clear()
print(len(info34))
# 元组不能使用clear()清空